<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>http请求头，Symbol数据类型</title>
</head>
<body>
  <script>
    /**
     *   请求头： application/json;charset=utf-8
     *   响应头   text/html  将请求当成html解析
     *           text/plain  
    */

    /**
     *  Symbol数据类型
     * 
     *  Symbol 
     *  本质上是一种唯一标识符，可用作对象的唯一属性名，
     *  这样其他人就不会改写或覆盖你设置的属性值。
    */
    
    var a = Symbol('x')
    console.log(a) //Symbol(x) 内存唯一
    var b = Symbol('x')
    console.log(b) //Symbol(x)
    console.log(a === b) // false 
    console.log(Symbol('x') === Symbol('x')) // false

    // 因此我们用于设置对象的唯一属性
    // 且该属性无法被枚举 for···in，object.keys() 不能访问
    var obj = {
        a:1,
    };
    let x = Symbol("x");
    let y = Symbol("y");
    obj[x] = "x";
    obj[y] = "y";
    console.log(obj)
    for(let i in obj){
     console.log(obj[i]); //1  只可以查询到1
    };

    // 读取
    // Object.getOwnPropertySymbols 
    // 方法会返回一个数组，
    // 成员是当前对象的所有用作属性名的 Symbol 值。
    var arr = Object.getOwnPropertySymbols(obj)
    console.log(arr) // [Symbol(x), Symbol(y)]
    arr.forEach(val=>{
      console.log(obj[val]) // x y
    })

    // 因为 Symbol 生成的值具有唯一性，
    // 但是不排除我们会多次使用它
    // Symbol.for() //该方法可以全局注册并登记
    let o = Symbol.for("name"); //检测到未存在则创建
    let p = Symbol.for("name"); //检测到存在则读取
    console.log(o,p); //Symbol(name) Symbol(name)
    console.log(o === p); //true

    // 通过symbol获取参数值的方法 Symbol.keyFor(); 
    // 只有通过 Symbol.for 注册的才可以
    let oS = Symbol.keyFor(o);
    let pS = Symbol.keyFor(p); 
    let q = Symbol("q");
    let qS = Symbol.keyFor(q); 
    console.log(oS,pS,qS) //name,name,undefine;
  </script>
</body>
</html>